module static_array(); 

// Static Array == Fixed Size Array

initial begin
/*
    // Packed Array: [data_type] [dimensions] [array_name]; 
    bit [2:0][3:0] arr;

    [@|@|@|@][@|@|@|@][@|@|@|@] 
        ^        ^        ^
        |        |        | 
     arr[2]   arr[1]    arr[0]
*/

    // 若声明一个 signed packed arrays, 
    // 当此数组作为一个整体时，其被视为有符号向量;
    // 但其数组元素的符号是由元素的类型决定的. 
    // 压缩数组是可综合的
    begin
        logic signed [1:0][7:0] pkg_arr = 16'h80_0F;
        $display("pkg_arr=%0d, pkg_arr[1]=%0d", pkg_arr, pkg_arr[1]);
        /** Output:
            pkg_arr=-32753, pkg_arr[1]=128
        */
    end


/*
    // Unpacked Array: [data_type] [array_name] [dimension];
    bit upkg_arr[2][3] = '{
        '{0, 1, 0},
        '{1, 0, 1}
    };

    [1]  [1]  [0]
    [1]  [0]  [1]
*/
    // 非压缩数组的内存排布不必是连续的
    // 非压缩数组是不可综合的
    // 压缩数组用于对 RAM/ROM 等进行建模
    begin
        bit upkg_arr[2][3] = '{
            '{0, 1, 0},
            '{1, 0, 1}
        };
        foreach (upkg_arr[i]) begin
            $display("upkg_arr[%0d]: %p", i, upkg_arr[i]);
        end
        /** Output:
            upkg_arr[0]: '{0, 1, 0}
            upkg_arr[1]: '{1, 0, 1}
        */
    end
/*
    // Mixed Array: [data_type] [dimensions] [array_name] [dimensions];

    bit [2] arr [0:3]; // 3 elements, each element is a 2-bit vector
    [@|@]  <-- arr[0]
    [@|@]  <-- arr[1]
    [@|@]  <-- arr[2]
*/
    begin
        logic [2] mixed_arr [1:4] = '{2'b01, 2'b10, 2'b11, 2'b00}; // 4x2
        foreach (mixed_arr[i]) begin
            $display("mixed_arr[%0d]: %p", i, mixed_arr[i]);
        end
        /** Output:
            mixed_arr[1]: 1
            mixed_arr[2]: 2
            mixed_arr[3]: 3
            mixed_arr[4]: 0
        */
    end
end

endmodule
